home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PsL Monthly 1994 December
/
PSL Monthly Shareware CD-ROM (Public Software Library)(December 1994).bin
/
prgmming
/
dos
/
c2
/
double.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-11-15
|
2KB
|
79 lines
#include <mem.h>
typedef unsigned real[3];
struct d_b { /*structure of a double (bits parsed for transferring
data from a pascal real */
unsigned int mant7 : 13; /*least signif. part of the mantissa*/
unsigned int mant6 : 3;
unsigned int mant5 : 13;
unsigned int mant4 : 3;
unsigned int mant3 :13;
unsigned int mant2 : 3;
unsigned int mant1 : 4; /*most signif. part of the mantissa*/
unsigned int exp : 11;
unsigned int sign : 1;
};
struct r_i { /*structure of a real (bits parsed for transferring
data to a double */
unsigned int exp : 8;
unsigned int mant6 : 3;
unsigned int mant5 :13;
unsigned int mant4 : 3;
unsigned int mant3 :13;
unsigned int mant2 : 3;
unsigned int mant1 : 4; /*most significant part of mantissa*/
unsigned int sign : 1;
};
union r_i_o { /*pascal real number input to inp*/
real inp; /*parsed bits transferred out as xfr */
struct r_i xfr;
};
union d_i_o { /*bits transferred in to inp*/
struct d_b inp; /*double read out as outp*/
double outp;
};
double real_double(real real_no)
{
union r_i_o r;
union d_i_o d;
int i;
for (i=0;i<3;i++) r.inp[i]=real_no[i];/*move real_no into transfer */
/* structure */
d.inp.exp = r.xfr.exp + 894; /*transfer data from pascal */
d.inp.sign = r.xfr.sign ; /* structure to double */
d.inp.mant1= r.xfr.mant1; /* structure */
d.inp.mant2= r.xfr.mant2;
d.inp.mant3= r.xfr.mant3;
d.inp.mant4= r.xfr.mant4;
d.inp.mant5= r.xfr.mant5;
d.inp.mant6= r.xfr.mant6;
d.inp.mant7= 0;
return d.outp; /*return result from double*/
/*structure*/
}
void double_real(real *real_no,double doub_no)
{
union r_i_o r;
union d_i_o d;
int i;
d.outp=doub_no;
r.xfr.exp = d.inp.exp-894;
r.xfr.sign = d.inp.sign;
r.xfr.mant1 = d.inp.mant1;
r.xfr.mant2 = d.inp.mant2;
r.xfr.mant3 = d.inp.mant3;
r.xfr.mant4 = d.inp.mant4;
r.xfr.mant5 = d.inp.mant5;
r.xfr.mant6 = d.inp.mant6;
memcpy(*real_no,r.inp,sizeof(real));
}